home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Games Collection 1 / software vault.zip / software vault / CDR10 / XLIB06.ZIP / XLIBTL02 / LBM2PBM.C < prev    next >
Text File  |  1992-11-21  |  4KB  |  156 lines

  1. #include <stdio.h>
  2. #include <alloc.h>
  3. #include <mem.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <dir.h>
  7. #include <dos.h>
  8. #include "xbmtools.h"
  9. #define TITLE "LBM2PBM - Linear to Planar bitmap conversion utility    T. Gouthas 20/11/92\n"
  10. #define SRC_EXT ".LBM"
  11. #define DEST_EXT ".PBM"
  12.  
  13. int convert(char *filenamein, char *filenameout);
  14. void syntax();
  15.  
  16. typedef struct _lbm_struc {
  17.   unsigned char width;
  18.   unsigned char height;
  19.   unsigned char data[];
  20. } far *LBM_PTR;
  21.  
  22. #define BUFF_LEN 100
  23. size_t farfread(void far *destptr,size_t size, size_t n, FILE *fp){
  24.    unsigned len;
  25.    unsigned char buff[BUFF_LEN];
  26.    len=size*n;
  27.    while(len >=BUFF_LEN){
  28.      fread(buff,BUFF_LEN,1,fp);
  29.      movedata((unsigned)_DS,(unsigned)buff,FP_SEG(destptr),FP_OFF(destptr),BUFF_LEN);
  30.      len-=BUFF_LEN;
  31.      (char far *)destptr+=BUFF_LEN;
  32.    }
  33.    if (len>0){
  34.      fread(buff,len,1,fp);
  35.      movedata((unsigned)_DS,(unsigned)buff,FP_SEG(destptr),FP_OFF(destptr),len);
  36.    }
  37. };
  38.  
  39. size_t farfwrite(void far *srcptr,size_t size, size_t n, FILE *fp){
  40.    unsigned len;
  41.    unsigned char buff[BUFF_LEN];
  42.    len=size*n;
  43.    while(len >=BUFF_LEN){
  44.      movedata(FP_SEG(srcptr),FP_OFF(srcptr),(unsigned)_DS,(unsigned)buff,BUFF_LEN);
  45.      fwrite(buff,BUFF_LEN,1,fp);
  46.      len-=BUFF_LEN;
  47.      (char far *)srcptr+=BUFF_LEN;
  48.    }
  49.    if (len>0){
  50.      movedata(FP_SEG(srcptr),FP_OFF(srcptr),(unsigned)_DS,(unsigned)buff,len);
  51.      fwrite(buff,len,1,fp);
  52.    }
  53. };
  54.  
  55.  
  56. int convert(char *filenamein, char *filenameout){
  57.   static char far *ibuff=NULL, far *obuff=NULL;
  58.   static unsigned isize=0, osize=0;
  59.   unsigned width,height;
  60.   LBM_PTR lbm_ptr;
  61.   FILE *fi, *fo;
  62.   char far * farchptr;
  63.   unsigned infilesize,outfilesize;
  64.   fi=fopen(filenamein,"rb+");
  65.   if(!fi) return 0;
  66.   
  67.   fseek(fi,0,SEEK_END);
  68.   infilesize = (unsigned) ftell(fi);
  69.   fseek(fi,0,SEEK_SET);
  70.   if (ibuff==NULL){
  71.     ibuff=farmalloc(infilesize);
  72.     if (ibuff==NULL) goto error;
  73.     isize=infilesize;
  74.   } else {
  75.     farchptr=farrealloc(ibuff,infilesize);
  76.     if (farchptr==NULL) goto error;
  77.     ibuff=farchptr;
  78.     isize=infilesize;
  79.   }
  80.   farfread(ibuff,infilesize,1,fi);
  81.   if ferror(fi) goto error;
  82.   lbm_ptr=(LBM_PTR) ibuff;
  83.   outfilesize=((lbm_ptr->width|3)^3)*lbm_ptr->height+2;
  84.   if (obuff==NULL){
  85.     obuff=farmalloc(infilesize);
  86.     if (obuff==NULL) goto error;
  87.     osize=outfilesize;
  88.   } else {
  89.     farchptr=farrealloc(obuff,outfilesize);
  90.     if (farchptr==NULL) goto error;
  91.     obuff=farchptr;
  92.     osize=outfilesize;
  93.   }
  94.   if(x_bm_to_pbm(ibuff,obuff)) return 0;
  95.   fo=fopen(filenameout,"wb+");
  96.   if (!fo) {
  97.     fclose(fi);
  98.     return 0;
  99.   }
  100.   farfwrite(obuff,1,osize,fo);
  101.   if ferror(fo) goto error;
  102.   fclose(fi);
  103.   fclose(fo);
  104.   return 1;
  105. error:
  106.   fclose(fi);
  107.   fclose(fo);
  108.   return 0;
  109. }
  110.  
  111. void syntax(){
  112.   printf("\n        LBM2PBM <filespec> [ <filespec> ..] \n\n");
  113.   exit(0);
  114. }
  115.  
  116. void main(int argc, char *argv[]){
  117.    int  i;
  118.    char *dotptr;
  119.    char *tempptr;
  120.    char drive[MAXDRIVE];
  121.    char dir[MAXDIR];
  122.    char name[MAXFILE];
  123.    char ext[MAXEXT];
  124.    char filenameraw[100];
  125.    char filenamewild[100];
  126.    char filenamein[100];
  127.    char filenameout[100];
  128.    struct ffblk ffb;
  129.    printf(TITLE);
  130.    if (argc<2) syntax();
  131.    for (i=1;i<argc;i++){
  132.      strupr(argv[i]);
  133.      strcpy(filenamewild,argv[i]);
  134.      printf("\nConverting files matching \"%s\".\n",argv[i]);
  135.  
  136.      fnsplit(filenamewild,drive,dir,NULL,ext);
  137.      if (*ext=='\0') strcat(filenamewild,SRC_EXT);
  138.  
  139.      if(findfirst(filenamewild,&ffb,0)){
  140.        printf("No files found.\n");
  141.        exit(1);
  142.      }
  143.      do {
  144.        fnsplit(ffb.ff_name,NULL,NULL,name,ext);
  145.        if (strcmp(ext,SRC_EXT)){
  146.      printf("Skipping  : %12s -> incorrect type.\n",ffb.ff_name);
  147.        } else {
  148.      fnmerge(filenamein,drive,dir,name,ext);
  149.      fnmerge(filenameout,drive,dir,name,DEST_EXT);
  150.      printf("Converting: %12s -> %12s  ",filenamein,filenameout);
  151.      if (convert(filenamein,filenameout)) printf("OK\n");
  152.      else printf("FAILED\n");
  153.        }
  154.      } while(!findnext(&ffb));
  155.    }
  156. }